---
title: "Limpeza - Coronavírus RS"
author: "Eduardo"
date: "`r Sys.Date()`"
output: pdf_document
toc: TRUE
lang: pt-br
urlcolor: blue
---

```{r echo=FALSE}
# OBSERVAÇÃO:
# A depender da memória do RAM do computador em que o script for executado,
# talvez seja necessário executar os comandos passo a passo e limpar
# a memória descenessária.
```


# Introdução

A Secretaria da Saúde do Rio Grande do Sul, no [Painel Coronavírus RS](https://ti.saude.rs.gov.br/covid19/), disponibiliza alguns [conjuntos de dados](https://ti.saude.rs.gov.br/covid19/api). Desses, escolhemos o conjunto _Casos Confirmados - microdados_ e, a partir dele, criamos um _dataset_ específico para tarefas de classificação e associação de regras.

```{r include=FALSE}
library(data.table)
library(dplyr)
library(magrittr)
library(hash)
```

# Seleção de atributos

Os atributos do conjunto _Casos Confirmados - microdados_ são os seguintes.

```{r echo=FALSE}
df <- fread('srag_rs.csv')
colnames(df)
```

Queremos criar um _dataset_ para a análise da ação do coronavírus nos indivíduos, por isso removemos atributos geográficos e temporais. O atributo `OUTROS` foi ignorado, pois não sabemos que outros sintomas são esses. O atributo `CONDICOES` será utilizado no futuro. Os atributos restantes são os seguintes, e o nome desse subconjunto é `carac`.

```{r echo=FALSE}
df %>%
  select(SEXO, FAIXAETARIA, IDADE, EVOLUCAO, HOSPITALIZADO,
         UTI, FEBRE, TOSSE, GARGANTA, DISPNEIA, RACA_COR, ETNIA_INDIGENA,
         PROFISSIONAL_SAUDE, SRAG, PES_PRIV_LIBERDADE) -> carac
colnames(carac)
```

# Transformação dos dados

Vamos analisar todas as colunas e transformá-las para diminuir o tamanho do _dataset_, que é muito grande.

## Sexo

Os valores que `SEXO` pode assumir são os seguintes.

```{r echo=FALSE}
unique(carac$SEXO)
```

Aplicamos as seguintes transformações a essa coluna.

```{r}
carac$SEXO[carac$SEXO == 'Masculino'] <- 'M'
carac$SEXO[carac$SEXO == 'Feminino'] <- 'F'
```

## Faixa Etária

Os valores que `FAIXAETARIA` pode assumir são os seguintes.

```{r echo=FALSE}
unique(carac$FAIXAETARIA) |> sort()
```

Nesse caso, vamos atribuir a cada faixa etária um código numérico.

```{r echo=FALSE}
FE <- unique(carac$FAIXAETARIA) |> sort()

hash_FE <- hash(
  FE,
  1:length(FE)
)

for (v in FE) {
  cat(v, ':', hash_FE[[v]], '\n')
}
```

```{r echo=FALSE}
carac$FAIXAETARIA <- lapply(carac$FAIXAETARIA, function (x) hash_FE[[x]])
```

## Idade

Não há muito o que fazer com o atributo `IDADE`, contudo percebemos que há um problema.

```{r echo=FALSE}
unique(carac$IDADE) |> sort()
```

Há exatamente `r count(filter(carac, IDADE > 120))` observações com idade maior do que 120 anos. Como esse número não é expressivo, esses casos podem ser removidos do conjunto de dados, mas faremos isso em uma etapa posterior.

## Evolução

Esse é um dos atributos mais importantes, pois diz se o paciente veio a óbito ou se recuperou. Os valores que `EVOLUCAO` pode assumir são os seguintes.

```{r echo=FALSE}
unique(carac$EVOLUCAO)
```
Por enquanto, deixaremos essa coluna da forma que está.

## Hospitalizado

Os valores que `HOSPITALIZADO` pode assumir são os seguintes.

```{r}
unique(carac$HOSPITALIZADO)
```
Vamos aplicar a seguinte transformação.

```{r}
carac$HOSPITALIZADO[carac$HOSPITALIZADO == 'NAO'] <- 'N'
carac$HOSPITALIZADO[carac$HOSPITALIZADO == 'SIM'] <- 'S'
```

## UTI

Os valores que `UTI` pode assumir são os seguintes.

```{r}
unique(carac$UTI)
```

Vamos aplicar a seguinte transformação.

```{r}
carac$UTI[carac$UTI == 'NAO'] <- 'N'
carac$UTI[carac$UTI == 'SIM'] <- 'S'
```

## Febre

Os valores que `FEBRE` pode assumir são os seguintes.

```{r}
unique(carac$FEBRE)
```

Além de abreviar os valores `r "NAO"` e `r "SIM"`, vamos assumir que o valor é `r "NAO"` quando não for informado.

```{r}
carac$FEBRE[carac$FEBRE == ''] <- 'N'
carac$FEBRE[carac$FEBRE == 'NAO'] <- 'N'
carac$FEBRE[carac$FEBRE == 'SIM'] <- 'S'
```

## Tosse

Os valores que `TOSSE` pode assumir são os seguintes.

```{r}
unique(carac$TOSSE)
```

Vamos aplicar as mesmas transformações que aplicamos à `FEBRE`.

```{r}
carac$TOSSE[carac$TOSSE == ''] <- 'N'
carac$TOSSE[carac$TOSSE == 'NAO'] <- 'N'
carac$TOSSE[carac$TOSSE == 'SIM'] <- 'S'
```

## Garganta

Os valores que `GARGANTA` pode assumir são os seguintes.

```{r}
unique(carac$GARGANTA)
```

Vamos aplicar as mesmas transformações anteriores.

```{r}
carac$GARGANTA[carac$GARGANTA == ''] <- 'N'
carac$GARGANTA[carac$GARGANTA == 'NAO'] <- 'N'
carac$GARGANTA[carac$GARGANTA == 'SIM'] <- 'S'
```

## Dispneia

Os valores que `DISPNEIA` pode assumir são os seguintes.

```{r}
unique(carac$DISPNEIA)
```

Vamos aplicar as mesmas transformações anteriores.

```{r}
carac$DISPNEIA[carac$DISPNEIA == ''] <- 'N'
carac$DISPNEIA[carac$DISPNEIA == 'NAO'] <- 'N'
carac$DISPNEIA[carac$DISPNEIA == 'SIM'] <- 'S'
```

## Raça/cor

OS valores que `RACA_COR` pode assumir são os seguintes.

```{r}
unique(carac$RACA_COR)
```

Vamos substituir o valor `r 'NAO INFORMADO'` por `r NA`.

```{r}
carac$RACA_COR[carac$RACA_COR == 'NAO INFORMADO'] <- NA
```

Vamos codificar as cores com valores numéricos.

```{r echo=FALSE}
RC <- unique(carac$RACA_COR) |> sort()
hash_RC <- hash(
  RC,
  1:length(RC)
)
carac$RACA_COR <- lapply(carac$RACA_COR,
                         function (x) {
                           if (!is.na(x)) {
                             return(hash_RC[[x]])
                           } else {
                             return(NA)
                           }
                         })
for (v in RC) {
  cat(v, ':', hash_RC[[v]], '\n')
}
```

## Etnia indígena

Os valores que `ETNIA_INDIGENA` pode assumir são os seguintes.

```{r}
unique(carac$ETNIA_INDIGENA)
```

Há exatamente `r count(filter(carac, ETNIA_INDIGENA == 'NAO ENCONTRADO'))` observações com o valor de `r 'NAO ENCONTRADO'`. Como esse valor é praticamente o número de observações, vamos assumir que ele corresponde a um paciente que não é indígena. Por isso, vamos substuí-lo por `r NA`. Além disso, vamos fazer a mesma coisa para os valores `r ''` e `r 'NÃO INFORMADO'`, que contam `r count(filter(carac, ETNIA_INDIGENA == ''))` e `r count(filter(carac, ETNIA_INDIGENA == 'NÃO INFORMADO'))`, respectivamente.

```{r}
carac$ETNIA_INDIGENA[carac$ETNIA_INDIGENA == 'NAO ENCONTRADO'] <- NA
carac$ETNIA_INDIGENA[carac$ETNIA_INDIGENA == ''] <- NA
carac$ETNIA_INDIGENA[carac$ETNIA_INDIGENA == 'NÃO INFORMADO'] <- NA
```

## Profissional da saúde

Os valores que `PROFISSIONAL_SAUDE` pode assumir são os seguintes.

```{r}
unique(carac$PROFISSIONAL_SAUDE)
```

Há `r count(filter(carac, PROFISSIONAL_SAUDE == 'NAO INFORMADO'))` observações com o valor `r 'NAO INFORMADO'`. Vamos substituí-lo por `r NA`.

```{r}
carac$PROFISSIONAL_SAUDE[carac$PROFISSIONAL_SAUDE == 'NAO INFORMADO'] <- NA
carac$PROFISSIONAL_SAUDE[carac$PROFISSIONAL_SAUDE == 'NAO'] <- 'N'
carac$PROFISSIONAL_SAUDE[carac$PROFISSIONAL_SAUDE == 'SIM'] <- 'S'
```

## SRAG

Os valores que `SRAG` pode assumir são os seguintes.

```{r}
unique(carac$SRAG)
```

Vamos aplicar a transformação para abreviar os valores.

```{r}
carac$SRAG[carac$SRAG == 'NAO'] <- 'N'
carac$SRAG[carac$SRAG == 'SIM'] <- 'S'
```

## Pessoa Privada de Liberdade

Os valores que `PES_PRIV_LIBERDADE` podem assumir são os seguintes.

```{r}
unique(carac$PES_PRIV_LIBERDADE)
```

Vamos aplicar a abreviação.

```{r}
carac$PES_PRIV_LIBERDADE[carac$PES_PRIV_LIBERDADE == 'NAO'] <- 'N'
carac$PES_PRIV_LIBERDADE[carac$PES_PRIV_LIBERDADE == 'SIM'] <- 'S'
```

# Condições

Aplicamos um _script_ à coluna `CONDICOES` para expandi-la.

```{r echo=FALSE}
condi <- fread('condi.csv')
colnames(condi)
```

Transformamos os valores `r NA` em `r 'N'` e `r TRUE` em `r 'S'`.

```{r}
condi[is.na(condi)] <- 'N'
condi[condi == TRUE] <- 'S'
```

# União dos _datasets_

Vamos unir `carac` com `condi`.

```{r}
carac_condi <- cbind(carac, condi)
colnames(carac_condi)
```

## Filtro por `IDADE` e `EVOLUCAO`

Por fim, filtramos as observações pela idade e evolução.

```{r}
carac_condi <- filter(carac_condi, IDADE < 120)
carac_condi <- filter(carac_condi, EVOLUCAO == 'OBITO' | EVOLUCAO == 'RECUPERADO')
```

```{r echo=FALSE}
#fwrite(carac_condi, 'carac_condi_rs.csv')
```

